package agent

import (
	"encoding/json"
	"fmt"
	"time"
)

// StepType 定义步骤类型
type StepType string

const (
	StepTypeThought     StepType = "thought"
	StepTypeAction      StepType = "action"
	StepTypeObservation StepType = "observation"
	StepTypeAskUser     StepType = "ask_user"
	StepTypeUserAnswer  StepType = "user_answer"
	StepTypeCompleted   StepType = "completed"
)

// ReActStep 表示ReAct循环中的一个步骤
type ReActStep struct {
	ID         int                    `json:"id"`          // 步骤ID
	Type       string                 `json:"type"`        // 类型: thought, action, observation, ask_user, user_answer
	Content    string                 `json:"content"`     // 内容
	Action     string                 `json:"action"`      // 执行的动作（仅action类型）
	Parameters map[string]interface{} `json:"parameters"`  // 动作参数（仅action类型）
	Question   string                 `json:"question"`    // 问用户的问题（仅ask_user类型）
	UserAnswer string                 `json:"user_answer"` // 用户回答（仅user_answer类型）
	Result     string                 `json:"result"`      // 执行结果
	Error      string                 `json:"error"`       // 错误信息
	Timestamp  string                 `json:"timestamp"`   // 时间戳
}

// NewStep 创建新步骤
func NewStep(stepType StepType, content string) ReActStep {
	return ReActStep{
		Type:      string(stepType),
		Content:   content,
		Timestamp: time.Now().Format("15:04:05"),
	}
}

// NewActionStep 创建行动步骤
func NewActionStep(action string, parameters map[string]interface{}) ReActStep {
	return ReActStep{
		Type:       string(StepTypeAction),
		Action:     action,
		Parameters: parameters,
		Timestamp:  time.Now().Format("15:04:05"),
	}
}

// NewThoughtStep 创建思考步骤
func NewThoughtStep(content string) ReActStep {
	return NewStep(StepTypeThought, content)
}

// NewObservationStep 创建观察步骤
func NewObservationStep(content string) ReActStep {
	return NewStep(StepTypeObservation, content)
}

// NewCompletedStep 创建完成步骤
func NewCompletedStep(content, finalAnswer string) ReActStep {
	return ReActStep{
		Type:      string(StepTypeCompleted),
		Content:   content,
		Result:    finalAnswer,
		Timestamp: time.Now().Format("15:04:05"),
	}
}

// NewAskUserStep 创建询问用户步骤
func NewAskUserStep(question string) ReActStep {
	return ReActStep{
		Type:      string(StepTypeAskUser),
		Question:  question,
		Timestamp: time.Now().Format("15:04:05"),
	}
}

// NewUserAnswerStep 创建用户回答步骤
func NewUserAnswerStep(answer string) ReActStep {
	return ReActStep{
		Type:       string(StepTypeUserAnswer),
		UserAnswer: answer,
		Content:    answer, // 同时设置content字段便于显示
		Timestamp:  time.Now().Format("15:04:05"),
	}
}

// SetResult 设置执行结果
func (s *ReActStep) SetResult(result string) {
	s.Result = result
}

// SetError 设置错误信息
func (s *ReActStep) SetError(err error) {
	if err != nil {
		s.Error = err.Error()
	}
}

// HasError 检查是否有错误
func (s *ReActStep) HasError() bool {
	return s.Error != ""
}

// GetParametersString 获取参数字符串表示
func (s *ReActStep) GetParametersString() string {
	if s.Parameters == nil {
		return ""
	}
	paramsBytes, err := json.Marshal(s.Parameters)
	if err != nil {
		return fmt.Sprintf("参数序列化错误: %v", err)
	}
	return string(paramsBytes)
}
